/*
 * @Author: yuanchenxi 836909158@qq.com
 * @Date: 2024-07-24 18:33:32
 * @LastEditors: Du Weixing duweixing@sgsimulation.com
 * @LastEditTime: 2024-11-03 20:23:22
 * @FilePath: \SGFEM\DataStructure\FEM\Element\include\CBUSHData.h
 */

#pragma once
#include "Utility/Algebra/Point.h"
#include "Utility/Algebra/Vector3D.h"

#include "DataStructure/Common/DataStructureNamespace.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Real.h"
#include "DataStructure/Input/Element/ElementBase.h"

SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
/** @brief 广义弹簧阻尼单元定义
 *
 * 单元具有一或者两个节点，能够提供刚度和阻尼
 *
 * @author Yuan Chenxi            2024.7.23
 */
struct DECLSPEC CBUSHData : public ElementBase
{
    SG::DataStructure::Common::Id   m_pId     = 0;      ///< 属性id
    SG::DataStructure::Common::Id   m_g[2]    = { 0 };  ///< 连接点id
    SG::DataStructure::Common::I64  m_flag    = -1;     ///< Orientation vector option: -1=CID, 0=XYZ basic, 1=XYZ global, 2=grid
    SG::DataStructure::Common::Real m_x1      = 0.0;    ///< 来自 GA 的方位矢量在 GA 的位移坐标系中的分量。
    SG::DataStructure::Common::Real m_x2      = 0.0;    ///< 来自 GA 的方位矢量在 GA 的位移坐标系中的分量。
    SG::DataStructure::Common::Real m_x3      = 0.0;    ///< 来自 GA 的方位矢量在 GA 的位移坐标系中的分量。
    SG::DataStructure::Common::Id   m_go      = 0;      ///< 使用网格点 GO 提供矢量的替代方法。  矢量的方向是从 GA 到 GO
    SG::DataStructure::Common::Id   m_coordId = -1;     ///< 坐标系标记， >=  0 使用坐标系;
                                                        ///<              = -1 本数据为空,使用朝向矢量或者定向节点
    ///< 定向节点，取值为 `DEFAULT_ID` 表示不使用定向节点，使用朝向向量
    SG::DataStructure::Common::Real m_s        = 0.5;  ///< 弹簧阻尼的位置
    SG::DataStructure::Common::Id   m_oCId     = -1;   ///< 弹簧阻尼偏移的坐标系识别
    SG::DataStructure::Common::Real m_s1       = 0.0;  ///< OCID 坐标系中的弹簧减震器偏移位置分量(如果 OCID > 0)
    SG::DataStructure::Common::Real m_s2       = 0.0;  ///< OCID 坐标系中的弹簧减震器偏移位置分量(如果 OCID > 0)
    SG::DataStructure::Common::Real m_s3       = 0.0;  ///< OCID 坐标系中的弹簧减震器偏移位置分量(如果 OCID > 0)
    SG::DataStructure::Common::I64  m_domainId = 0;
    static ElementTypes             GetType ()
    {
        return ElementTypes::ELETYPE_Bush;
    };
    /// @brief 来自 GA 的方位矢量在 GA 的位移坐标系中的分量
    /// @return
    SG::Algebra::Vector3D GetXi () const;

    /// @brief OCID 坐标系中的弹簧减震器偏移位置(如果 OCID > 0)
    /// @return
    SG::Algebra::Point GetSi () const;
};

/// @brief 判断两个CBUSHData是否相等
/// @param a
/// @param b
/// @return
DECLSPEC bool operator== (const SG::DataStructure::FEM::CBUSHData &a, const SG::DataStructure::FEM::CBUSHData &b);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE